home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / amiga / viewers / edtview.lha / source / DT5.e < prev    next >
Text File  |  1993-09-11  |  14KB  |  525 lines

  1. /* $VER: EDTShow_Source 0.5 (10.09.93) Colin Bell
  2. ** I can be contacted at fidonet #3:714/909.4#
  3. **
  4. ** E picture viewer. USES WB3.0's DATATYPES.LIBRARY
  5. **
  6. ** THIS CODE IS COPYRIGHT 1993 COLIN BELL. YOU MAY USE ANY OF
  7. ** THIS CODE IN YOUR OWN UTILITIES BUT YOU MUST GIVE ME CREDIT.
  8. ** THIS CODE MAY NOT BE SOLD OR USED IN ANY SHAREWARE OR
  9. ** COMMERCIAL VENTURE WITHOUT WRITTEN PERMISSION FROM THE AUTHOR.
  10. ** THIS CODE CARRIES NO WARRANTIES WHATSOEVER. USE AT YOUR OWN RISK.
  11. **  This code is loosely based on a C example source by CBM.
  12. **
  13. ** This program is nowhere near a complete program & is released as 
  14. ** example code to show WB3's great datatypes features etc.
  15. **
  16. ** *****SHOWS IFF,JPG,GIF,BMP,PCX *********************************
  17. ** *****SAVES IFF (YOU MAY USE THIS AS A SIMPLE PIC CONVERTER)*****
  18. ** *****ALLOWS YOU TO CHANGE THE SCREENMODE BEFORE THE SAVE********
  19. ** (if you have all the datatypes installed)
  20. **
  21. ** To Compile type: EPP dt5 EDTView
  22. **                    EC      EDTView
  23. ** NOTE: I use some PMODULES to include WB3 constants. When the WB3 
  24. ** EModules come out, use the following & remove the PMODULES.
  25. **
  26. ** MODULE 'datatypes/datatypes', datatypes/datatypesclass',
  27. **        'datatypes/pictureclass'
  28. **
  29. ** Also note, My ASL requester uses the proper code unlike the example
  30. ** provided with E which uses OBSOLETE lib calls  8-)
  31. */
  32.  
  33.  
  34. MODULE 'dos/dos', 'exec/memory', 'exec/libraries', 'graphics/gfx'
  35. MODULE 'Asl', 'libraries/Asl', 'intuition/screens', 'graphics/rastport'
  36. MODULE 'libraries/gadtools', 'gadtools', 'exec/ports', 'intuition/intuition'
  37. MODULE 'datatypes'              /*MY VERSION. INCLUDED WITH THIS SOURCE*/
  38.  
  39. /*
  40. ** AS THERE ARE NO WB3 MODULES FOR E YET, THESE CONTAIN SOME DATATYPES
  41. ** CONSTANTS AND ARE LINKED IN WITH EPP (E PRE PROCESSOR BY BARRY WILLS)
  42. ** HEY BARRY, Why does EPP pop WB to the front?? I compile on CED's screen!
  43. */
  44.  
  45. PMODULE 'pmodules:dtconsts'    /*These are included with the source*/
  46. PMODULE 'pmodules:dtOBJs'
  47.  
  48. CONST    GTMN_NEWLOOKMENUS = GT_TAGBASE+67 /*WB3 newlookmenus tag*/
  49. CONST    WA_NEWLOOKMENUS = WA_MENUHELP+1
  50. ENUM    LOAD,SAVE                         /*For my ASL requester*/
  51. CONST    SA_INTERLEAVED = SA_FULLPALETTE+7 /*interleaved screen tag*/
  52. CONST    OBP_PRECISION = $84000000
  53. CONST    PRECISION_EXACT    = -1
  54. CONST    PRECISION_IMAGE    = 0
  55. CONST    PRECISION_ICON = 16
  56. CONST    PRECISION_GUI = 32
  57.  
  58. DEF dtf:PTR TO dtframebox,fri:PTR TO frameinfo,o
  59. DEF fullpath[255]:STRING,visual    
  60. DEF bm=NIL:PTR TO bitmap,modeid=NIL
  61. DEF    wnd:PTR TO window,menustrip,class,code,iaddr
  62. DEF scr=NIL:PTR TO screen,cregs=NIL,scrflag=0,ret=0
  63. DEF port:PTR TO mp
  64. DEF dpen,bpen
  65. OPT OSVERSION=39    /* OS 3.0 *ONLY* */
  66.  
  67. /************************************************************************/
  68. PROC main()
  69. DEF numcolors=NIL
  70. DEF bmhd=NIL:PTR TO bitmapheader, s
  71. DEF gpl:PTR TO gplayout,pen
  72. VOID '$VER: EDTShow 0.5 (10.09.93) Colin Bell'
  73.  
  74. /*Do ASL file requester and join path/name*/
  75. getfile(LOAD,'Select Picture to load',0) 
  76.  
  77. IF ^fullpath <> NIL    
  78.  
  79.      IF dtbase:=(OpenLibrary('datatypes.library',39))
  80.  
  81.         WriteF('\s.\n',fullpath) /*show filename*/
  82.  
  83.         /*obtain a pointer to the picture object*/
  84.         IF     (o:=NewDTObjectA(fullpath,[DTA_SOURCETYPE,DTST_FILE,
  85.                                       DTA_GROUPID,GID_PICTURE,
  86.                                       PDTA_REMAP,FALSE,NIL]))
  87.             
  88.         /*get some mem for these structures*/
  89.  
  90.             dtf:=New(SIZEOF dtframebox)
  91.             fri:=New(SIZEOF frameinfo)
  92.         
  93.             dtf.dtf_methodid:=DTM_FRAMEBOX
  94.             dtf.dtf_frameinfo:=fri
  95.             dtf.dtf_contentsinfo:=fri
  96.             dtf.dtf_sizeframeinfo:=SIZEOF frameinfo    
  97.         
  98. /*domethoda(obj,msg) is MY ASM written version of the amiga.lib function*/
  99. /*I hope a new version of E can link with amiga.lib coz this took me    */
  100. /*2 days to bloody work out. `o' is the object from NewDTObjecta */
  101. /*This first call to domethod gets info on the picture*/
  102.  
  103.             IF (domethoda(o,dtf)) 
  104.                 /*Display the info obtained*/
  105.                 WriteF('PropFlags  : 0x\h\n',fri.propertyflags)
  106.                 WriteF('Redbits    : \d\n',fri.redbits)
  107.                 WriteF('Bluebits   : \d\n',fri.bluebits)
  108.                 WriteF('Greenbits  : \d\n',fri.greenbits)
  109.                 WriteF('Width      : \d\n',fri.width)
  110.                 WriteF('Height     : \d\n',fri.height)
  111.                 WriteF('Depth      : \d\n',fri.depth)        
  112.             ENDIF    
  113.  
  114.             gpl:=New(SIZEOF gplayout)
  115.             gpl.gplmi:=DTM_PROCLAYOUT
  116.             gpl.ginfo:=NIL
  117.             gpl.initial:=1
  118.  
  119. /* this next part gives us the modeid, the color regs, the number of  colours,
  120. ** a bitmapheader, and a bitmap structure including the bitmap. 
  121. ** In other words, It loads in, and converts whatever file format. 
  122. ** I call it "The BIGGY"  8-)
  123. */
  124.                     /*layout object*/
  125.             IF (domethoda(o,gpl))
  126.  
  127.                 GetDTAttrs(o,
  128.                             [PDTA_MODEID,{modeid},
  129.                             PDTA_CREGS,{cregs},
  130.                             PDTA_NUMCOLORS,{numcolors},
  131.                             PDTA_BITMAPHEADER,{bmhd},
  132.                             PDTA_BITMAP,{bm},NIL])
  133.  
  134.  
  135.               REPEAT
  136. /*                WriteF('ModeID:    : 0x\h\n',modeid)*/
  137.                 scrflag:=0 
  138.                 IF (bm)  /*if we got a bitmap*/
  139.                         
  140.                     IF scr:=openscr()    /*open screen*/
  141.  
  142.                         IF (cregs)
  143.  
  144.                             docregs(numcolors)    /*set color registers*/            
  145.  
  146.  
  147. /*There must be a better way to set menu pens????????*/
  148. /*I AM USING FindColor HERE*/
  149.                             MOVE.L    scr,A0
  150.                             LEA        44(A0),A0
  151.                             MOVE.L    4(A0),A3
  152.                             MOVEQ    #0,D0
  153.                             MOVE.L    #$FFFFFFFF,D1
  154.                             MOVE.L    #$FFFFFFFF,D2
  155.                             MOVE.L    #$FFFFFFFF,D3
  156.                             MOVE.L    numcolors,D4
  157.                             MOVEA.L    gfxbase,A6
  158.                             JSR        -1008(A6)    
  159.                             MOVE.L    D0,dpen
  160.  
  161.                             MOVE.L    scr,A0
  162.                             LEA        44(A0),A0
  163.                             MOVE.L    4(A0),A3
  164.                             MOVEQ    #0,D0
  165.                             MOVEQ    #0,D1
  166.                             MOVEQ    #0,D2
  167.                             MOVEQ    #0,D3
  168.                             MOVE.L    numcolors,D4
  169.                             MOVEA.L    gfxbase,A6
  170.                             JSR        -1008(A6)    
  171.                             MOVE.L    D0,bpen
  172.  
  173.                             IF (wnd:=domainwindow(scr))
  174.                             /*Wait for user & do whats requested*/
  175.                                 waitandact()
  176.                                 closew(wnd)
  177.                             ENDIF
  178.                         ENDIF
  179.                     CloseScreen(scr)
  180.                     ELSE
  181.                         WriteF('Could not open Screen\n')
  182.                     ENDIF
  183.                 ELSE
  184.                     WriteF('Got no bitmap\n')
  185.                 ENDIF
  186.               UNTIL (scrflag = 0)
  187.  
  188.             ELSE
  189.                 WriteF('2nd domethod failed')
  190.             ENDIF
  191.     
  192.             DisposeDTObject(o)
  193.     
  194.         ELSE
  195.             WriteF('DT Object failed\n Unknown file format?\n')
  196.         ENDIF                                
  197.  
  198.         CloseLibrary(dtbase)
  199.     ELSE
  200.     WriteF('Cannot open datatypes.library\n')
  201.     ENDIF    
  202.     
  203. ELSE    
  204.     WriteF('Need a pic name\n')
  205. ENDIF
  206.  
  207. ENDPROC 
  208. /*************************************************************************/
  209. PROC showerror(id)    /*though, i've never used it yet*/
  210.  
  211. DEF msg[80]:STRING
  212.  
  213.     IF id
  214.         IF (id < 2000)
  215.             PrintFault(id,' Error Code: ')
  216.         ELSE
  217.             WriteF(GetDTString(id))
  218.         ENDIF
  219.     ENDIF
  220. ENDPROC
  221. /************************************************************************/
  222. /*Put up an ASL filerequester*/
  223.  
  224. PROC    getfile(mode,tbar,w)   /*LOAD or SAVE, Title, Window*/
  225. DEF    fflags=0
  226. DEF req:PTR TO filerequestr
  227.  
  228.     IF (mode = SAVE) THEN fflags:=FILF_SAVE
  229.  
  230. IF aslbase:=OpenLibrary('asl.library',39)
  231.     IF req:=AllocAslRequest(ASL_FILEREQUEST,NIL)
  232.  
  233.       IF AslRequest(req,[ASL_HAIL,tbar,ASL_FUNCFLAGS,fflags,ASL_WINDOW,w,
  234.                         ASL_HEIGHT,300,ASL_PATTERN,'#?',NIL])
  235.         makefullpath(req.dir,req.file)
  236.       ENDIF
  237.       FreeAslRequest(req)
  238.     ELSE
  239.       WriteF('Could not open filerequester!\n')
  240.     ENDIF
  241.     CloseLibrary(aslbase)
  242. ELSE
  243.     WriteF('Could not open asl.library!\n')
  244. ENDIF
  245.  
  246. ENDPROC 
  247. /************************************************************************/
  248. /* takes a dir & a filename. And joins them adding a / when needed*/
  249. PROC makefullpath(dir,file)          
  250.     
  251. DEF col,c[2]:STRING
  252.  
  253.     MidStr(c,dir,((StrLen(dir))-1),1)     /*Get last character in string*/
  254.  
  255.     /* if dir=0 is like cmp.l #0,A0, if ^dir=0 is like cmp.l #0,(A0)  */
  256.                                        
  257.     IF (^dir=0) AND (^file=0)
  258.         
  259.     ELSEIF ^dir=0 OR (col:=StrCmp(c,':',1)) OR (col:=StrCmp(c,'/',1))
  260.         StringF(fullpath,'\s\s',dir,file)
  261.     ELSE /*otherwise, insert a "/" inbetween */
  262.         StringF(fullpath,'\s/\s',dir,file)
  263.     ENDIF
  264. ENDPROC    
  265. /************************************************************************/
  266. /* THE AMIGA.LIB FUNCTION DoMethodA  REWRITTEN FOR E */
  267.  
  268. PROC    domethoda(obj,msg)    /*Object to perform method on*/
  269.                             /*Msg to perform on object*/
  270.         MOVE.L    obj,A2
  271.         MOVE.L    A2,D0
  272.         BEQ.S    cmnullreturn
  273.         MOVE.L    msg,A1
  274.         MOVE.L    -4(A2),A0
  275.         PEA        cmreturn(PC)
  276.         MOVE.L    8(A0),-(A7)
  277.         RTS
  278. cmreturn:
  279.         UNLK    A5    /*I want to keep D0 so return myself */
  280.         RTS
  281. cmnullreturn:    /*This converts to    MOVEQ     #0,D0    */
  282.                 /*                    UNLK    A5        */
  283.                 /*                    RTS                */
  284. ENDPROC    
  285. /*****************************************************/
  286. PROC domainwindow(scr)
  287. DEF g,menus:PTR TO newmenu,sigbit
  288.  
  289. IF (wnd:=OpenWindowTagList(NIL,[WA_WIDTH,fri.width,WA_HEIGHT,fri.height,
  290.                         WA_BACKDROP,TRUE,WA_BORDERLESS,TRUE,
  291.                         WA_CUSTOMSCREEN,scr,WA_SUPERBITMAP,bm,
  292.                         WA_NEWLOOKMENUS,FALSE,WA_DETAILPEN,bpen,WA_BLOCKPEN,dpen,
  293.                         WA_IDCMP,IDCMP_MENUPICK,WA_ACTIVATE,TRUE,NIL]))=NIL THEN RETURN 0
  294. IF (gadtoolsbase:=OpenLibrary('gadtools.library',37))=NIL THEN RETURN 0
  295.  
  296. IF (visual:=GetVisualInfoA(scr,NIL))=NIL THEN RETURN 0
  297.  
  298. IF (menustrip:=CreateMenusA([NM_TITLE,0,'Project',0,0,0,0,
  299.                             NM_ITEM,0,'About','A',0,0,3,
  300.                             NM_ITEM,0,'Mode','M',0,0,1,
  301.                             NM_ITEM,0,'Save','S',0,0,2,
  302.                             NM_ITEM,0,'Quit','Q',0,0,4,
  303.                             NM_END,0,NIL,0,0,0,0]:newmenu,NIL))=NIL THEN RETURN 0
  304. IF (LayoutMenusA(menustrip,visual,[GTMN_NEWLOOKMENUS,FALSE,NIL]))=NIL THEN RETURN 0
  305.  
  306. IF (SetMenuStrip(wnd,menustrip))=NIL THEN RETURN 0                
  307.  
  308. ScreenToFront(scr)
  309. ENDPROC wnd                        
  310. /***********************************************************************/
  311. PROC closew(wnd)
  312.  
  313. IF (menustrip)                 
  314.     ClearMenuStrip(wnd)
  315.     FreeMenus(menustrip)
  316. ENDIF
  317.  
  318. IF (visual) THEN FreeVisualInfo(visual)
  319.  
  320. IF (gadtoolsbase) THEN CloseLibrary(gadtoolsbase)
  321.  
  322. ScreenToBack(scr)
  323. IF (wnd) THEN CloseWindow(wnd)
  324.  
  325. ENDPROC
  326. /*******************************************************/
  327. PROC    waitandact()
  328. DEF    done=0
  329. DEF msg:PTR TO intuimessage,type
  330.         port:=wnd.userport
  331.         WHILE    done = 0
  332.             Wait(Shl(1,port.sigbit))
  333.             WHILE ((done)=NIL) AND (msg:=GetMsg(port))
  334.                 code:=msg.code
  335.                 iaddr:=msg.iaddress
  336.                 class:=msg.class
  337.                 SELECT  class
  338.                 CASE IDCMP_MENUPICK
  339.                     done:=handlemenus()
  340.                 ENDSELECT
  341.                 ReplyMsg(msg)
  342.             ENDWHILE
  343.                                     
  344.         ENDWHILE
  345. ENDPROC
  346. /*****************************************************/
  347. PROC    handlemenus()    /*menunumber*/
  348. DEF    item:PTR TO menuitem,userdat
  349.         ret:=0
  350.     WHILE ((code <> 0)AND(ret = 0)AND(code <> MENUNULL))
  351.     
  352.         item:=ItemAddress(menustrip,code)
  353.  
  354. /*have to do this in ASM as I can't think how to now & its so simple anyway*/
  355. /*34(a0) is outside the normal menu structure*/
  356.  
  357.         MOVE.L    item,A0
  358.         MOVE.L    34(A0),D0    /*This is userdata as contained in gt macro*/
  359.         MOVE.L    D0,userdat
  360.  
  361.         SELECT    userdat
  362.             CASE 1
  363.                 screenmode()
  364.                 ret:=1
  365.             CASE 2
  366.                 savepic()
  367.                 ret:=0
  368.             CASE 3
  369.                 doabout()
  370.                 ret:=0
  371.             CASE 4
  372.                 ret:=1
  373.             CASE 5
  374.                 ret:=0
  375.         ENDSELECT
  376.  
  377.         code:=item.nextselect
  378.  
  379.     ENDWHILE
  380. ENDPROC ret
  381. /*****************************************************/
  382. PROC    doabout()
  383. /*EasyRequestArgs(window,easyStruct,idcmpPtr,args)(a0/a1/a2/a3)*/
  384. DEF    gargs[150]:STRING
  385.     StringF(gargs,'EDTView 0.5 By C.Bell\nFile: \s\nWidth: \d Height: \d\nDepth: \d ModeID 0x\h',fullpath,fri.width,fri.height,fri.depth,modeid)
  386.     ScreenToBack(scr)
  387.      EasyRequestArgs(NIL,[20,0,0,gargs,'Cool Bananas'],0,NIL)
  388.     ScreenToFront(scr)
  389. ENDPROC
  390. /*****************************************************/
  391. /*****************************************************/
  392. /*This routine saves the picture as an IFF ILBM*/
  393. /*ITt MAY be possible to save GIF,JPG etc. Need the 3.1 RKM's though 8-)*/
  394.  
  395. PROC    savepic()
  396. DEF    fh, dtw:PTR TO dtwrite
  397.  
  398.     getfile(SAVE,'Select file to save',NIL)
  399.  
  400.     IF ^fullpath <> NIL    
  401.  
  402.         /*If we have changed screenmode, set this*/
  403.  
  404.         SetDTAttrs(o,0,0,[PDTA_MODEID,modeid])
  405.  
  406.         /*open file, domethod (write), close file*/
  407.  
  408.         fh:=Open(fullpath,NEWFILE)
  409.         dtw:=New(SIZEOF dtwrite)
  410.         dtw.dtw_methodid:=DTM_WRITE
  411.         dtw.dtw_filehandle:=fh
  412.         dtw.dtw_ginfo:=NIL
  413.         dtw.dtw_mode:=0
  414.         domethoda(o,dtw)
  415.         Close(fh)
  416.     ELSE
  417.         WriteF('File save failed')
  418.     ENDIF
  419.  
  420. ENDPROC
  421. /*****************************************************/
  422. /* Do a screenmode requester. Do it on WB so we can see 
  423. ** it if pens are bad. Not sure if the way it saves ham
  424. ** mode is right. But it works. 8-)
  425. */
  426. PROC    screenmode()
  427. DEF req:PTR TO filerequestr,ham=0
  428.  
  429.  
  430. IF aslbase:=OpenLibrary('asl.library',39)
  431.     IF req:=AllocAslRequest(ASL_SCREENMODEREQUEST,NIL)
  432.  
  433.     WbenchToFront()
  434.  
  435. /*these tags are in my pmodules as they are 2.1+ */
  436.  
  437.       IF AslRequest(req,[ASL_HAIL,'Choose new screenmode',ASL_WINDOW,0,
  438.                         ASLSM_DOWIDTH,TRUE,ASLSM_DOHEIGHT,TRUE,
  439.                         ASLSM_DOOVERSCANTYPE,TRUE,ASL_HEIGHT,300,
  440.                         ASLSM_INITIALDISPLAYID,modeid,
  441.                         ASLSM_INITIALDISPLAYWIDTH,scr.width,
  442.                         ASLSM_INITIALDISPLAYHEIGHT,scr.height,NIL])
  443. /*Keep ham bit if its there*/
  444.                         ham:=And($800,modeid)                    
  445. /*and OR it back in*/
  446.                         modeid:=Or(ham,req.reserved1)
  447.                     scrflag:=1 /*set this so that repeat until loop loops*/
  448.                         ret:=1
  449.                         WriteF('ModeID:    : 0x\h\n',modeid)
  450.       
  451.       ENDIF  
  452.     FreeAslRequest(req)
  453.     ELSE
  454.       WriteF('Could not open filerequester!\n')
  455.     ENDIF
  456.     CloseLibrary(aslbase)
  457. ELSE
  458.     WriteF('Could not open asl.library!\n')
  459. ENDIF
  460.  
  461. ENDPROC
  462. /*****************************************************/
  463. /* HMM, I had to write this in ASM coz I could not get OpenScreenTagList
  464. ** to work with E !!!!!!  Maybe it's just me
  465. */
  466. PROC  openscr()
  467. DEF s
  468.         MOVE.L    intuitionbase,A6
  469.         SUBA.L    A0,A0
  470.         MOVE.L    #0,-(A7)
  471.         MOVE.L    #TRUE,-(A7)
  472.         MOVE.L    #SA_AUTOSCROLL,-(A7)
  473.         MOVE.L    #TRUE,-(A7)
  474.         MOVE.L    #SA_BEHIND,-(A7)
  475.         MOVE.L    #TRUE,-(A7)
  476.         MOVE.L    #SA_QUIET,-(A7)
  477.         MOVE.L    #FALSE,-(A7)
  478.         MOVE.L    #SA_SHOWTITLE,-(A7)
  479.         MOVE.L    modeid,-(A7)
  480.         MOVE.L    #SA_DISPLAYID,-(A7)
  481.         MOVE.L    fri,A2
  482.         MOVE.L    20(A2),-(A7)
  483.         MOVE.L    #SA_DEPTH,-(A7)
  484.         MOVE.L    16(A2),-(A7)
  485.         MOVE.L    #SA_HEIGHT,-(A7)
  486.         MOVE.L    12(A2),-(A7)
  487.         MOVE.L    #SA_WIDTH,-(A7)
  488.         MOVE.L    #TRUE,-(A7)
  489.         MOVE.L    #SA_INTERLEAVED,-(A7)
  490.         MOVE.L    #OSCAN_MAX,-(A7)
  491.         MOVE.L    #SA_OVERSCAN,-(A7)
  492.  
  493.         MOVE.L    A7,A1
  494.         JSR        -612(A6)
  495.         MOVE.L    D0,s
  496.         ADDA.L    #84,A7
  497.  
  498. ENDPROC    s
  499. /***********************************************************/
  500. /* This routine sets all the pen colors using SetRGB32 and had to be done 
  501. ** in ASM due to no WB3 Emodules
  502. */
  503. PROC docregs(numcolors)        /*set color registers*/
  504.     
  505.     MOVEQ    #0,D4    
  506.     MOVE.L    numcolors,D5
  507. rgbloop:
  508.     MOVEA.L    scr,A0
  509.     LEA        44(A0),A0        /*Viewport*/
  510.     MOVE.L    D4,D0
  511.     MULU    #12,D0
  512.     MOVEA.L    cregs,A3
  513.     MOVE.L    0(A3,D0.L),D1
  514.     MOVE.L    4(A3,D0.L),D2
  515.     MOVE.L    8(A3,D0.L),D3
  516.     MOVE.L    D4,D0
  517.     MOVE.L    gfxbase,A6
  518.     JSR        -852(A6)        /*SetRGB32*/
  519.     ADDQ.L    #1,D4            /*step1 */
  520.     CMP.L    D4,D5
  521.     BNE.S    rgbloop    
  522. ENDPROC
  523. /****************************************************************/
  524.  
  525.